package com.xuecheng.content.controller;

import com.alibaba.fastjson.JSON;
import com.xuecheng.base.exception.ValidatedGroups;
import com.xuecheng.base.model.PageParams;
import com.xuecheng.base.model.PageResult;
import com.xuecheng.content.model.dto.*;
import com.xuecheng.content.model.po.CourseBase;
import com.xuecheng.content.service.ICourseBaseService;
import com.xuecheng.content.service.ICoursePreviewService;
import com.xuecheng.content.service.ICoursePublishService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * @author 勾新杰
 * @version 1.0
 * @description: 课程信息管理接口
 * @date 2024/12/15 16:11
 */
// JSP (JavaServer Pages) 和 Thymeleaf 是两种服务器端模板引擎，它们的作用是将后端返回的数据与HTML结构相结合，生成最终要发送给客户端浏览器的完整网页
@RestController
@RequestMapping("/course")
@RequiredArgsConstructor
@Api(value = "课程信息编辑接口", tags = "课程信息管理接口")
public class CourseBaseController {

    private final ICourseBaseService courseBaseService; // 课程信息管理服务

    /**
     * 课程查询接口
     *
     * @param pageParams        分页参数
     * @param queryCourseParams 查询参数
     * @return 分页查询结果
     */
    @ApiOperation("课程分页条件查询")
    @PreAuthorize("hasAuthority('xc_teachmanager_course_list')")
    @PostMapping("/list")
    public PageResult<CourseBaseAuditDTO> list(
            PageParams pageParams,
            @RequestBody(required = false) QueryCourseParamsDTO queryCourseParams) { // 条件是可选的
        return courseBaseService.pageQueryCourseBase(pageParams, queryCourseParams);
    }

    /**
     * 新增课程基本信息
     *
     * @param saveCourseBaseDTO 新增课程基本信息
     * @return 新增课程基本信息
     */
    @PostMapping
    @PreAuthorize("hasAuthority('xc_teachmanager_course_add')")
    @ApiOperation("新增课程基本信息")
    public CourseBaseInfoDTO save(@RequestBody @Validated(ValidatedGroups.Insert.class) // 这里用@Validated注解，JSR-303进行表单参数合法校验，这部分交给控制器校验，这个注解支持分组校验
                                  SaveCourseBaseDTO saveCourseBaseDTO) {
        return courseBaseService.save(saveCourseBaseDTO);
    }

    /**
     * 根据课程id查询课程基本信息
     *
     * @param id 课程id
     * @return 课程基本信息
     */
    @GetMapping("/{id}")
    @ApiOperation("根据课程id查询课程基本信息")
    public CourseBaseInfoDTO getById(@PathVariable Long id) {
        return courseBaseService.getCourseBaseInfoById(id);
    }

    /**
     * 修改课程基本信息
     *
     * @param updateCourseBaseDTO 修改课程基本信息
     */
    @PutMapping
    @PreAuthorize("hasAuthority('xc_teachmanager_course_edit')")
    @ApiOperation("修改课程基本信息")
    public CourseBaseInfoDTO update(@RequestBody @Validated(ValidatedGroups.Update.class)
                                    UpdateCourseBaseDTO updateCourseBaseDTO) {
        return courseBaseService.update(updateCourseBaseDTO);
    }

    /**
     * 删除课程基本信息、课程计划信息、课程营销信息、课程媒资信息、课程教师等
     *
     * @param id 课程id
     */
    @DeleteMapping("/{id}")
    @ApiOperation("删除课程")
    public void delete(@PathVariable Long id) {
        courseBaseService.deleteById(id);
    }

    /**
     * 获取课程发布信息
     *
     * @param courseId 课程id
     * @return 课程发布信息
     */
    @ApiOperation("获取课程发布信息")
    @ResponseBody
    @GetMapping("/whole/{courseId}")
    public CoursePreviewDTO getCoursePublish(@PathVariable("courseId") Long courseId) {
        return courseBaseService.getPublishWhole(courseId);
    }
}
